/**
 * @file FileIO.h
 * @brief 文件输入输出处理类的声明
 * 
 * 该类提供了高性能的文件读写功能，主要用于处理节点数据。
 * 核心特性：
 * 1. 使用内存映射实现高效文件读取
 * 2. 支持大文件处理
 * 3. 提供数据压缩功能
 * 4. 支持Windows和POSIX系统
 */
#pragma once
#include <string>
#include <vector>
#include "GridStructs.h"

class FileIO {
public:
    /**
     * @brief 内存映射文件类
     * 
     * 提供跨平台的内存映射文件访问功能，
     * 支持Windows和POSIX系统
     */
    class MemoryMappedFile {
    public:
        MemoryMappedFile();
        ~MemoryMappedFile();
        
        bool open(const std::string &filename, size_t &fileSize);
        void *getData() const;
        
    private:
        #ifdef _WIN32
        void *hFile;     ///< Windows文件句柄
        void *hMapping;  ///< Windows文件映射句柄
        #else
        int fd;          ///< POSIX文件描述符
        size_t length;   ///< 映射长度
        #endif
        void *data;      ///< 映射的内存指针
    };

    /**
     * @brief 读取已知节点数据
     * @param filename 输入文件路径
     * @param nodes 输出参数，存储节点数据
     * @throw std::runtime_error 当文件读取失败时抛出异常
     */
    static void readKnownNodes(const std::string &filename,
                             std::vector<NodeProperty> &nodes);

    /**
     * @brief 读取未知节点数据
     * @param filename 输入文件路径
     * @param points 输出参数，存储节点坐标
     * @throw std::runtime_error 当文件读取失败时抛出异常
     */
    static void readUnknownNodes(const std::string &filename,
                               std::vector<Point3D> &points);

    /**
     * @brief 保存插值结果到文件
     * @param filename 输出文件路径
     * @param results 插值结果数据
     * @throw std::runtime_error 当文件写入失败时抛出异常
     */
    static void saveResults(const std::string &filename,
                          const std::vector<Result> &results);

private:
    static bool checkFileExists(const std::string &filename);
}; 